/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package braipetro.client.regras;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author manasses
 */

enum OperadorLogico {
    IGUAL, MAIOR, MENOR, DIFERENTE, MAIOR_IGUAL, MENOR_IGUAL
}

public class Criterio extends Thread {
    private String nome;
    private Regra regra;
    private long tempoAtualizacao = 1000;   //milisegundos 
    private Metodo metodo;
    private Double valorRef = 0.0;
    private OperadorLogico operador;
    private Boolean triggered = false;
    private Boolean ativo = true;
     
//------------------------------------------------------------------------------
// Constructors
//------------------------------------------------------------------------------
    
    public Criterio() {}
    
    public Criterio(Regra rg) {
        this.regra = rg;
    }

//------------------------------------------------------------------------------
// Gets and Sets
//------------------------------------------------------------------------------
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public long getTempoAtualizacao() {
        return tempoAtualizacao;
    }

    public void setTempoAtualizacao(long tempoAtualizacao) {
        this.tempoAtualizacao = tempoAtualizacao;
    }

    public Regra getRegra() {
        return regra;
    }

    public void setRegra(Regra regra) {
        this.regra = regra;
    }

    public Metodo getMetodo() {
        return metodo;
    }

    public void setMetodo(Metodo metodo) {
        this.metodo = metodo;
    }

    public Double getValorRef() {
        return valorRef;
    }

    public void setValorRef(Double valorRef) {
        this.valorRef = valorRef;
    }

    public OperadorLogico getOperador() {
        return operador;
    }

    public void setOperador(OperadorLogico operador) {
        this.operador = operador;
    }
    
    public void setOperador(String operador) {
        if (operador.equals("MAIOR"))
            this.operador = OperadorLogico.MAIOR;
    }

    public Boolean isStatus() {
        return triggered;
    }

    public void setStatus(Boolean status) {
        this.triggered = status;
    }

    public Boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }
    
    
//------------------------------------------------------------------------------
// Overriding methods
//------------------------------------------------------------------------------
    
    @Override
    public void run() {
        super.run(); //To change body of generated methods, choose Tools | Templates.
        
        while (true) {
            try {
                Double res = Double.valueOf(String.valueOf(metodo.execute()));

                switch (operador) {
                    case IGUAL: triggered = res == valorRef;
                        break;
                    case MAIOR: triggered = res > valorRef;
                        break;
                    case MENOR: triggered = res < valorRef;
                        break;
                    case DIFERENTE: triggered = res != valorRef;
                        break;
                    case MAIOR_IGUAL: triggered = res >= valorRef;
                        break;
                    case MENOR_IGUAL: triggered = res <= valorRef;
                        break;
                }
                
                if (triggered) {
                    regra.trigger();
                }

                sleep(tempoAtualizacao);

            } catch (InterruptedException | IllegalArgumentException ex) {
                Logger.getLogger(Criterio.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            if (!ativo) {
                break;
            }
        }
    }
    
    


}
